#/bin/bash

#
# Defino la variable de entorno si postular esta en ejecucion
#
POSTULAR_EN_EJECUCION="SI";

#
#
#
archivoPostulantesRegex="([a-zA-Z0-9]{6})\.([0-9]{6})";

#
# Defino regex para codigoBeneficio
#
codigoBeneficioRegex="[a-zA-Z0-9]{5}";

#
# Defino regex para cuil
#
cuilRegex="[0-9]{11}";

#
# Defino regex para tipoDocumento
#
tipoDocumentoRegex="DU|LC|LE|PA";

#
# Defino regex para numeroDocumento
#
numeroDocumentoRegex="[0-9]{9}"

#
# Defino regex para apellido
#
apellidoRegex="[a-zA-Z[:space:]]{5,30}";

#
# Defino regex para nombre
#
nombreRegex="[a-zA-Z[:space:]]{5,30}";

#
# Defino regex para domicilio
#
domicilioRegex="[a-zA-Z[:space:]]{5,30}";

#
# Defino regex para localidad
#
localidadRegex="[a-zA-Z[:space:]]{5,30}";

#
# Defino regex para provincia
#
provinciaRegex="[a-zA-Z[:space:]]{5,30}";

#
# Defino regex para duracion
#
duracionRegex="[0-9]*"

#
# Defino el registro a usar
#
registro="";
#
# Defino el campo codigoBeneficio
#
codigoBeneficio="";

#
# Defino el campo cuil
#
cuil="";

#
# Defino el campo tipoDocumento
#
tipoDocumento="":

#
# Defino el campo numeroDocumento
#
numeroDocumento="";

#
# Defino el campo apellido
#
apellido="";

#
# Defino el campo nombre
#
nombre="";

#
# Defino el campo domicilio
#
domicilio="";

#
# Defino el campo localidad
#
localidad="";

#
# Defino el campo provincia
#
provincia="";

#
# Defino el campo fechaPedidoAlta
#
fechaPedidoAlta="";

#
# Defino el campo duracion
#
duracion="";

#
# Defino el process id del proceso actual
#
PID=$$;

function parsear_archivo_postulantes()
{
	if [[ $archivo =~ $archivoPostulantesRegex ]]
	then
		agencia=${BASH_REMATCH[1]}
		secuencia=${BASH_REMATCH[2]}
	fi;
	return 0;
}

#
# Funcion que parsea un registro
#
function parsear_registro()
{
	registroParsear=$1;
	#
	# Obtengo campo codigoBeneficio
	#
	codigoBeneficio=`echo "$registroParsear" | awk -F ',' ' { print $1 } '`;
	. gralog.sh "POSTULAR" "Codigo beneficio: $codigoBeneficio" "I";
	#
	# Obtengo campo cuil
	#
	cuil=`echo "$registroParsear" | awk -F ',' ' { print $2 } '`;
	. gralog.sh "POSTULAR" "Cuil: $cuil" "I";
	#
	# Obtengo campo tipoDocumento
	#
	tipoDocumento=`echo "$registroParsear" | awk -F ',' ' { print $3 } '`;
	. gralog.sh "POSTULAR" "Tipo documento: $tipoDocumento" "I";
	#
	# Obtengo campo numeroDocumento
	#
	numeroDocumento=`echo "$registroParsear" | awk -F ',' ' { print $4 } '`;
	. gralog.sh "POSTULAR" "Numero documento: $numeroDocumento" "I";
	#
	# Obtengo campo apellido
	#
	apellido=`echo "$registroParsear" | awk -F ',' ' { print $5 } '`;
	. gralog.sh "POSTULAR" "Apellido: $apellido" "I";
	#
	# Obtengo campo nombre
	#
	nombre=`echo "$registroParsear" | awk -F ',' ' { print $6 } '`;
	. gralog.sh "POSTULAR" "Nombre: $nombre" "I";
	#
	# Obtengo campo domicilio
	#
	domicilio=`echo "$registroParsear" | awk -F ',' ' { print $7 } '`;
	. gralog.sh "POSTULAR" "Domicilio: $domicilio" "I";
	#
	# Obtengo campo localidad
	#
	localidad=`echo "$registroParsear" | awk -F ',' ' { print $8 } '`;
	. gralog.sh "POSTULAR" "Localidad: $localidad" "I";
	#
	# Obtengo provincia
	#
	provincia=`echo "$registroParsear" | awk -F ',' ' { print $9 } '`;
	. gralog.sh "POSTULAR" "Provincia: $provincia" "I";
	#
	# Obtengo fechaPedidoAlta
	#
	fechaPedidoAlta=`echo "$registroParsear" | awk -F ',' ' { print $10 } '`;
	. gralog.sh "POSTULAR" "Fecha pedido alta: $fechaPedidoAlta" "I";
	#
	# Obtengo duracion
	#
	duracion=`echo "$registroParsear" | awk -F ',' ' { print $11 } '`;
	. gralog.sh "POSTULAR" "Duracion: $duracion" "I";

	return 0;
}

#
# Funcion que valida un registro fisico
#
function validar_registro_fisico()
{
	#
	# Asumo registro valido
	#
	local registroValido=0;

	#
	# Valido codigo de beneficio
	#
	if [[ $codigoBeneficio =~ $codigoBeneficioRegex ]]
	then
		. gralog.sh "POSTULAR" "Codigo de beneficio matcheo con formato" "I";
	else
		. gralog.sh "POSTULAR" "Codigo de beneficio invalido" "E";
		informar_error_archivo_postulantes "Codigo de beneficio invalido";
		registroValido=1;
	fi;

	#
	# Valido cuil
	#
	if [[ $cuil =~ $cuilRegex ]]
	then
		. gralog.sh "POSTULAR" "Cuil matcheo con formato" "I";
	else
		. gralog.sh "POSTULAR" "Cuil invalido" "E";
		informar_error_archivo_postulantes "Cuil invalido";
		registroValido=1;
	fi;

	#
	# Valido tipo de documento
	#
	if [[ $tipoDocumento =~ $tipoDocumentoRegex ]]
	then
		. gralog.sh "POSTULAR" "Tipo documento matcheo con formato" "I";
	else
		. gralog.sh "POSTULAR" "Tipo de documento invalido" "E";
		informar_error_archivo_postulantes "Tipo de documento invalido";
		registroValido=1;
	fi;

	#
	# Valido numero de documento
	#
	if [[ $numeroDocumento =~ $numeroDocumentoRegex ]]
	then
		. gralog.sh "POSTULAR" "Numero de documento matcheo con formato" "I";
	else
		. gralog.sh "POSTULAR" "Numero de documento invalido" "E";
		informar_error_archivo_postulantes "Numero de documento invalido";
		registroValido=1;
	fi;

	#
	# Valido apellido
	#
	if [[ $apellido =~ $apellidoRegex ]]
	then
		. gralog.sh "POSTULAR" "Apellido matcheo con formato" "I";
	else
		. gralog.sh "POSTULAR" "Apellido invalido" "E";
		informar_error_archivo_postulantes "Apellido invalido";
		registroValido=1;
	fi;

	#
	# Valido nombre
	#
	if [[ $nombre =~ $nombreRegex ]]
	then
		. gralog.sh "POSTULAR" "Nombre matcheo con formato" "I";
	else
		. gralog.sh "POSTULAR" "Nombre invalido" "E";
		informar_error_archivo_postulantes "Nombre invalido";
		registroValido=1;
	fi;

	#
	# Valido domicilio
	#
	if [[ $domicilio =~ $domicilioRegex ]]
	then
		. gralog.sh "POSTULAR" "Domicilio matcheo con formato" "I";
	else
		. gralog.sh "POSTULAR" "Domicilio invalido" "E";
		informar_error_archivo_postulantes "Domicilio invalido";
		registroValido=1;
	fi;

	#
	# Valido localidad
	#
	if [[ $localidad =~ $localidadRegex ]]
	then
		. gralog.sh "POSTULAR" "Localidad matcheo con formato" "I";
	else
		. gralog.sh "POSTULAR" "Localidad invalida" "E";
		informar_error_archivo_postulantes "Localidad invalida";
		registroValido=1;
	fi;

	#
	# Valido provincia
	#
	if [[ $provincia =~ $provinciaRegex ]]
	then
		. gralog.sh "POSTULAR" "Provincia matcheo con formato" "I";
	else
		. gralog.sh "POSTULAR" "Provincia invalida" "E";
		informar_error_archivo_postulantes "Provincia invalida";
		registroValido=1;
	fi;

	#
	# Valido fechaPedidoAlta
	#
	if [ -n "$fechaPedidoAlta" ]
	then
		. validar_fecha.sh "$fechaPedidoAlta"
		if [ $? -ne 0 ]
		then
			. gralog.sh "POSTULAR" "Fecha pedido alta invalida" "E";
			informar_error_archivo_postulantes "Fecha pedido alta invalida";
			registroValido=1;
		fi;
	fi;

	#
	# Valido duracion
	#
	if [ -n "$duracion" ]
	then
		if [[ $duracion =~ $duracionRegex ]]
		then
			. gralog.sh "POSTULAR" "Duracion matcheo con formato" "I";
		else
			. gralog.sh "POSTULAR" "Duracion invalida" "E";
			informar_error_archivo_postulantes "Duracion invalida";
			registroValido=1;
		fi;
	fi;

	return $registroValido;
}

#
# Funcion que valida un registro logico
#
function validar_registro_logico()
{
	#
	# Considero registro valido
	#
	local registroValido=0;

	#
	# Busco codigo beneficio en archivo maestro
	#
	local codigoBeneficioMaestro=`cat "$grupo/data/beneficios.mae" | cut -d, -f 2 | grep "$codigoBeneficio"`;

	. gralog.sh "POSTULAR" "Codigo beneficio maestro: $codigoBeneficioMaestro" "I";

	if [ -z "$codigoBeneficioMaestro" ]
	then
		. gralog.sh "POSTULAR" "Codigo de beneficio inexistente en maestro" "E";
		informar_error_archivo_postulantes "No existe el beneficio";
		registroValido=1;
	else
		#
		# Codigo existente busco fecha fin beneficio para beneficio dado
		#
		local fechaFinBeneficio=`cat "$grupo/data/beneficios.mae" | grep "$codigoBeneficio" | cut -d, -f 4`;

		. gralog.sh "POSTULAR" "Fecha Fin Beneficio: $fechaFinBeneficio" "I";

		if [ -n "$fechaPedidoAlta" ]
		then
			. comparar_fechas.sh "$fechaPedidoAlta" "$fechaFinBeneficio"
			if [ $? -eq 2 ]
			then
				. gralog.sh "POSTULAR" "FPA mayor a FFB" "E";
				informar_error_archivo_postulantes "FPA mayor a FFB";
			fi;
		fi;

		#
		# Codigo existente busco duracion de beneficio para beneficio dado
		#
		local duracionBeneficio=`cat "$grupo/data/beneficios.mae" | grep "$codigoBeneficio" | cut -d, -f 5`;
	
		if [ -n "$duracion" -a $duracion -gt $duracionBeneficio ]
		then
			. gralog.sh "POSTULAR" "DP mayor a DMB" "E";
			informar_error_archivo_postulantes "DP mayor a DMB";
		fi;
	fi;

	return $registroValido;
}

#
# Funcion que informa error en archivo de postulantes
#
function informar_error_archivo_postulantes()
{
	#
	# Obtengo motivo por parametro
	#
	motivo=$1;

	#
	# Genero la linea de error
	#
	lineaError="$agencia-$secuencia-$numeroRegistro-$motivo-$registro";

	#
	# Escribo la linea de error
	#
	
	echo "$lineaError" >> "$grupo/nuevos/benerro.$PID"


	return 0;
}

#
# Funcion que guarda un registro de postulantes
#
function guardar_registro()
{
	#
	# Obtengo registro validado
	#
	registroValidado=$1;

	#
	# Calculo la fecha corriente
	#
	fechaCorriente=`date "+%Y-%m-%d"`;

	#
	# Calculo la fecha de inicio de beneficio
	#
	fechaInicioBeneficio=`cat "$grupo/data/beneficios.mae" | grep "$codigoBeneficio" | cut -d, -f 3`;
	. gralog.sh "POSTULAR" "Fecha Inicio Beneficio: $fechaInicioBeneficio" "I";
	#
	# Calculo la fecha de fin de beneficio
	#
	fechaFinBeneficio=`cat "$grupo/data/beneficios.mae" |  grep "$codigoBeneficio" | cut -d, -f 4`;
	. gralog.sh "POSTULAR" "Fecha Fin Beneficio: $fechaFinBeneficio" "I";
	#
	# Calculo la duracion de beneficio
	#
	duracionBeneficio=`cat "$grupo/data/beneficios.mae" | grep "$codigoBeneficio" | cut -d, -f 5`;
	. gralog.sh "POSTULAR" "Duracion Beneficio: $duracionBeneficio" "I";

	. gralog.sh "POSTULAR" "Comparando $fechaCorriente con $fechaInicioBeneficio" "I";

	. comparar_fechas.sh "$fechaCorriente" "$fechaInicioBeneficio"
	primerComparacion=$?;

	. gralog.sh "POSTULAR" "Comparando $fechaPedidoAlta con $fechaInicioBeneficio" "I";

	. comparar_fechas.sh "$fechaPedidoAlta" "$fechaInicioBeneficio"
	segundaComparacion=$?;

	if [ $primerComparacion -eq 0 -a $segundaComparacion -eq 0 ]
	then
		fechaEfectivaAlta=$fechaInicioBeneficio;
	fi;

	. gralog.sh "POSTULAR" "Comparando $fechaCorriente con $fechaPedidoAlta" "I";

	. comparar_fechas.sh "$fechaCorriente" "$fechaPedidoAlta"
	primerComparacion=$?;

	. gralog.sh "POSTULAR" "Comparando $fechaInicioBeneficio con $fechaPedidoAlta" "I";

	. comparar_fechas.sh "$fechaInicioBeneficio" "$fechaPedidoAlta"
	segundaComparacion=$?;

	if [ $primerComparacion -eq 0 -a $segundaComparacion -eq 0 ]
	then
		fechaEfectivaAlta=$fechaPedidoAlta;
	fi;

	. gralog.sh "POSTULAR" "Comparando $fechaInicioBeneficio con $fechaCorriente" "I";

	. comparar_fechas.sh "$fechaInicioBeneficio" "$fechaCorriente"
	primerComparacion=$?;

	. gralog.sh "POSTULAR" "Comparando  $fechaPedidoAlta con $fechaCorriente" "I";

	. comparar_fechas.sh "$fechaPedidoAlta" "$fechaCorriente"
	segundaComparacion=$?;

	if [ $primerComparacion -eq 0 -a $segundaComparacion -eq 0 ]
	then
		fechaEfectivaAlta=$fechaCorriente
	fi;

	#
	# Calculo estado
	#
	. comparar_fechas.sh "$fechaEfectivaAlta" "$fechaCorriente"
	if [ $? -eq 2 ]
	then
		motivo="Pendiente ya que FEA > FC";
		estado="Pendiente";
	fi;
	if [ $? -eq 1 ]
	then
		motivo="Aceptada ya que FEA = FC";
		estado="Aceptada";
	fi;

	if [ $registroValidado -eq 1 ]
	then
		motivo="Rechazado por campos invalidos";
		estado="Rechazado";
	fi;

	if [ -z $duracion ]
	then
		duracion=$duracionBeneficio;
	fi;

	#
	# Genero lineaRegistroNuevo
	#
	lineaRegistroNuevo="$agencia,$secuencia,$codigoBeneficio,$cuil,$tipoDocumento,$numeroDocumento,$apellido,$nombre,$domicilio,$localidad,$provincia,$fechaPedidoAlta,$fechaEfectivaAlta,$duracion,$estado,$motivo,$usuario,$fechaCorriente";

	#
	# Escribo el registro
	#
	echo "$lineaRegistroNuevo" >> "$grupo/nuevos/benef.$PID";

	return 0;
}

#
# Almaceno IFS viejo
#
OIFS=$IFS;

#
# Establezco nuevo IFS
#
IFS="
";

#
# Itero por cada archivo de arridir
#
RECIDIR="$grupo/recibidos";
listaArchivos=`ls $RECIDIR`;
for archivo in $listaArchivos
do
	. gralog.sh "POSTULAR" "Procesando archivo $archivo" "I";
	#
	# Parseo nombre de archivo de postulantes
	#
	parsear_archivo_postulantes

	#
	# Inicializo el numero de registro del archivo actual
	#
	numeroRegistro=0;
	#
	# Itero por cada registro del archivo actual
	for registroIterado in `cat $RECIDIR/$archivo`
	do
		registro=$registroIterado;
		. gralog.sh "POSTULAR" "Procesando registro $registro" "I";
		#
		# Incremento el numero de registro del archivo actual
		#
		numeroRegistro=`echo "$numeroRegistro + 1" | bc`;

		#
		# Calculo cantidad de campos del registro
		#
		cantidadCampos=`echo "$registro" | awk -F',' ' { print NF } '`;
		. gralog.sh "POSTULAR" "Cantidad de campos es: $cantidadCampos" "I";

		registro=$registroIterado;
		. gralog.sh "POSTULAR" "Registro ahora es: $registro" "I";

		#
		# Valido cantidad de campos del registro
		#
		if [ $cantidadCampos -ne 11 ]
		then
			informar_error_archivo_postulantes "Cantidad de regisros invalida, debe ser entre 9 y 11";
		else
			registro=$registroIterado;
			#
			# Considero registro valido
			#
			registroValidado=0;

			# . gralog.sh "POSTULAR" "Esta por procesar registro: $registro" "I";

			#
			# Parseo registro
			#
			parsear_registro $registro

			. gralog.sh "POSTULAR" "Termino de procesar registro" "I";

			. gralog.sh "POSTULAR" "Esta por validar registro fisico" "I";

			#
			# Valido registro fisico
			#
			validar_registro_fisico	

			if [ $? -ne 0 ]
			then
				. gralog.sh "POSTULAR" "Archivo $archivo rechazado, no paso validacion fisica" "E";
				registroValidado=1;
			fi;
			. gralog.sh "POSTULAR" "Valido registro fisico" "I";

			. gralog.sh "POSTULAR" "Esta por validar registro logico" "I";

			#
			# Valido registro logico
			#
			validar_registro_logico

			if [ $? -ne 0 ]
			then
				. gralog.sh "POSTULAR" "Archivo $archivo rechazado, no paso validacion logica" "E";
				registroValidado=1;
			fi;

			guardar_registro $registroValidado
		fi;
	done;
	. mover.sh "$RECIDIR/$archivo" "$grupo/procesados/$archivo";
done;
#
# Termine de iterar cada archivo de arridir
#

#
# Establezco viejo IFS
#
IFS=$OIFS;

POSTULAR_EN_EJECUCION="NO";
